import java.util.*;

public class 城市群数量3 {
    //并查集的方式实现


    public class Solution {
        //初始化最大值, 不用担心是否会使用到没用到的部位, 因为位置是0, 并且有set代表长度
        public static int HMAX = 201;
        //并查集的数组, 下标代表数字, 递归版不需要小挂大
        public static int[] farther = new int[HMAX];
        //集合的长度
        public static int set;
        //返回值
        public static int ret;

        public static void union(int a,int b){
            //看一下两个人的头一不一样, 一样说明在一个集合
            int fa = find(a);
            int fb = find(b);
            //不一样挂一下即可
            if(fa != fb){
                farther[fa] = fb;
                //集合数量减一下
                ret--;
            }
        }
        //核心代码, 用递归实现, 不断找到最上头的元素
        public static int find(int n){
            //是if不是while不然会死循环的
            if(n != farther[n]){
                farther[n] = find(farther[n]);
            }
            return farther[n];
        }

        //有时候不需要写这个
        public static boolean isSameSet(int a,int b){
            return find(a) == find(b);
        }
        //配合题意写一下
        public int citys (ArrayList<ArrayList<Integer>> t) {
            set = t.size();
            ret = set;
            for(int i = 0;i < set;i++){
                farther[i] = i;
            }
            for(int i = 0;i < set;i++){
                for(int j = 0;j < set;j++){
                    if(t.get(i).get(j) == 1){
                        union(i,j);
                    }
                }
            }
            return ret;
        }

    }
}
